#include<bits/stdc++.h>
using namespace std;
struct lr{
int l,r;
};
int n,m,L,V;
int t;
int d[100005],v[100005],a[100005];
int s[100005];
lr pos[100005];
int p[100005];
int sum;
int cell(int a,int b){
    if(a%b==0){
        return a/b;
    }else{
        return a/b+1;
    }
}
bool cmp(lr a,lr b){
    if(a.l==b.l){
        return a.r<b.r;
    }else{
    return a.l<b.l;
    }

}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>t;

    while(t--){
        cin>>n>>m>>L>>V;
        sum=n;
        for(int i=0;i<n;i++){
            cin>>d[i]>>v[i]>>a[i];
            if(a[i]==0)
            {
                if(v[i]>V){
                    pos[i].l=d[i];
                    pos[i].r=L;
                }else{
                    pos[i].l=0;
                    pos[i].r=0;
                    sum--;
                }

            }else{
                if(a[i]<0){
                    if(v[i]>V){
                        pos[i].l=d[i];
                        pos[i].r=d[i]+((V*V-v[i]*v[i])/(2*a[i]));
                    }else{
                        pos[i].l=0;
                        pos[i].r=0;
                        sum--;
                    }
                }else{
                    if(v[i]>V){
                        pos[i].l=d[i];
                        pos[i].r=L;
                    }else{
                        int h=d[i]+cell((V*V-v[i]*v[i]),(2*a[i]));
                        if(h>L){
                            pos[i].l=0;
                            pos[i].r=0;
                            sum--;
                        }else{
                            pos[i].l=h;
                            pos[i].r=L;
                        }

                    }
                }
            }
        }
       // for(int i=0;i<n;i++){
        //    cin>>pos[i].l>>pos[i].r;
        //}
        for(int i=0;i<m;i++){
            cin>>p[i];
            for(int j=0;j<n;j++){
                if(pos[j].l==0&&pos[j].r==0){
                    continue;
                }
                if(p[i]>=pos[j].l&&p[i]<=pos[j].r){
                    s[j]++;
                }
            }
        }
        int ans=0;
        for(int i=0;i<n;i++){
            if(s[i]!=0){
                ans++;
            }else{
                pos[i].l=0;
                pos[i].r=0;
            }
        }
        cout<<ans<<" ";
        int ans2=0;
        sort(pos,pos+n,cmp);
       //for(int i=0;i<n;i++){
       //     cout<<pos[i].l<<" "<<pos[i].r<<endl;
       // }
       // for(int i=0;i<m;i++){
       //     cout<<p[i]<<" ";
       // }
        for(int i=0;i<n-1;i++){
            while(pos[i].l==0&&pos[i].r==0)i++;
            if(pos[i].r>=pos[i+1].r){
                pos[i].l=0;
                pos[i].r=0;
            }
        }
        sort(pos,pos+n,cmp);
        for(int i=0;i<n;i++){
            while(pos[i].l==0&&pos[i].r==0)i++;
            int ni=i;
            while(pos[ni].r>=pos[i+1].l&&i<n-1)i++;

            int flag=1;
            for(;i>=ni&&flag;i--){

                for(int j=0;j<m&&flag;j++){
                    if(p[j]>=pos[i].l&&p[j]<=pos[ni].r){

                        flag=0;
                        ans2++;
                    }
                }
            }
            if(!flag)i++;
            //cout<<ni+1<<endl;
        }
        cout<<m-ans2<<endl;
        for(int i=0;i<n;i++){
            d[i]=0;
            v[i]=0;
            s[i]=0;
            a[i]=0;
            pos[i]=(lr){0,0};
        }
        for(int i=0;i<m;i++){
            p[i]=0;

        }
    }
    return 0;
}
